package conservare.dao;

import java.util.List;

import javax.persistence.EntityTransaction;

import conservare.modelo.contrato.Contrato;
import conservare.modelo.type.Mes;
import conservare.modelo.type.SituacaoContrato;

public class ContratoDAO extends Dao{

	private static final long serialVersionUID = -6869092153992984208L;

	public Contrato salvar(Contrato contrato) {
		
		EntityTransaction transaction = getEm().getTransaction();
		
		try{
			transaction.begin();
			if(contrato.getId() == null){
				getEm().persist(contrato);
			}else{
				getEm().merge(contrato);
			}
			transaction.commit();
		}catch(Exception e){
			e.printStackTrace();
		}
		
		return contrato;
	}
	
	public Contrato getById(Integer id) {
		return getPojo(Contrato.class, id);
	}

	public List<Contrato> getTodos() {
		return getList(Contrato.class, "select c from Contrato c order by c.id desc");
	}
	
	public List<Contrato> getContratosDisponiveisParaLancamentoNoMes(Integer anoRef, Mes mesRef){
		
		StringBuilder sql = new StringBuilder("");
		sql.append("SELECT a FROM Contrato a ")
		.append("   WHERE a.situacao = ?1 AND ")
		.append("         a.id not in ")
		.append("                   (SELECT b.contrato.id FROM ContaAReceber b WHERE b.anoDeReferencia = ?2 AND b.mesDeReferencia = ?3 ) ")
		.append("   ORDER BY a.id desc ");
		
		return getList(Contrato.class, sql.toString(), SituacaoContrato.ATIVO, anoRef, mesRef);
		
	}

	public List<Contrato> getContratosAtivos() {
		String sql = "SELECT a FROM Contrato a WHERE a.situacao = ?1";
		return getList(Contrato.class, sql, SituacaoContrato.ATIVO);
	}
	
}
